// P1
new Promise((resolve, reject) => {
        console.log("A");
        setTimeout(() => {
            console.log("B");
        }, 0);
        console.log("C");
        resolve();
        console.log("D");
    })
    .then(() => {
        console.log("E");
        // P3
        new Promise((resolve, reject) => {
                console.log("F");
                resolve();
                console.log("G");
            })
            .then(() => {
                setTimeout(() => {
                    console.log("H");
                }, 0);
                console.log("I");
            })
            .then(() => {
                console.log("J");
            });
    })
    .then(() => {
        console.log("K");
    });

setTimeout(() => {
    console.log("L");
}, 0);
// P2
new Promise((resolve, reject) => {
    console.log("M");
    resolve();
}).then(() => {
    setTimeout(() => {
        // P4
        new Promise((resolve, reject) => {
                console.log("N");
                resolve();
            })
            .then(() => {
                setTimeout(() => {
                    console.log("O");
                }, 0);
            })
            .then(() => {
                console.log("P");
            });
    }, 0);
});

console.log("Q");
// A C D M Q E F G I K J B L N P H O
// 1. 先执行同步代码，Promise的执行器也是同步代码优先执行
// A C D 将计时器B放入第一个宏任务队列, C打印之后, 将P1.then1推入第一轮微任务队列
// Macrotasks: [timer_B] --- Microtasks: [P1.then1]
// 继续往下， 看到计时器timer_L，将计时器作为宏任务推入队列
// Macrotasks: [timer_B， timer_L] --- Microtasks: [P1.then1]
// 执行P2的执行器，打印M， 将P2.then1推入第一轮微任务队列
// Macrotasks: [timer_B， timer_L] --- Microtasks: [P1.then1, P2.then1]
// 执行同步代码, 打印Q

/** 同步代码执行完了，去看下异步任务队列 */
// 遍历Microtasks_1， 执行微任务
// 执行P1.then1， 打印E F(将P3.then1推入第二轮微任务队列)G
// 执行P1.then1之后，将P1.then2推入第二轮微任务队列
// Macrotasks: [timer_B， timer_L] --- Microtasks: [P3.then1, P1.then2]
// 执行P2.then1, 将宏任务Last推入队列
// Macrotasks: [timer_B，timer_L, LAST] --- Microtasks: [P3.then1, P1.then2]

/** 执行第二轮 */
// P3.then1, 打印I， 推入宏任务H，将微任务P3.then2推入下一轮微任务队列
// Macrotasks: [timer_B，timer_L, LAST, timer_H] --- Microtasks: [P3.then2]
// P1.then2, 打印K， 
// Macrotasks: [timer_B，timer_L, LAST, timer_H]--- Microtasks: [P3.then2]

/** 执行第三轮 */
// P3.then2 打印J
// 第三轮微任务队列执行完之后，微任务队列没有可执行微任务，看看渲染有无任务，没有则取出一个宏任务执行，打印B
// 此时依然没有微任务继续取出宏任务执行，打印L
// 此时依然没有微任务继续取出宏任务执行LAST
// 打印N， Macrotasks: [timer_H] --- Microtasks: [P4.then1]

/** 执行第四轮 */

// P4.then1， 将计时器O推入宏任务队列, P4.then2推入微任务队列
// Macrotasks: [timer_H, timerO] --- Microtasks: [P4.then2]


/** 执行第5轮 */
// P4.then2 打印P
// 第5轮微任务队列执行完之后，看下有无渲染任务，没有则取出一个宏任务执行, 打印O
// // Macrotasks: [] --- Microtasks: []

// 执行结束

let b = {
    fn: function (a, b) {
        console.log(arguments.caller, arguments.callee)
        return a + b
    }
}

function foo() {
    var a = 2;
    this.bar()
}

function bar() {
    console.log(this, this.a)
}
foo()